<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // *所以闭包的功能就是使一个函数能访问另一个函数作用域中的变量。形成闭包之后，该变量不会被垃圾回收机制回收。
    // *闭包的原理其实还是作用域。
    // *使用闭包的优点是可以避免全局变量污染，缺点是容易造成内存泄露。
    // function add() {
    //  var counter = 0;
    //  return counter += 1;
    //}
    // 闭包是否就是高阶函数
    //var add = (function () {
    //  var counter = 0;
    //  return function () {
    //    return counter += 1;
    //  }
    //})();
    const arr = []
    for (var i = 0; i < 5; i++) {
      const fn = function (n) { // 定义闭包函数
        arr.push(function () {
          console.log(n)
        })
      }
      fn(i) // 执行函数，把每次执行 for 循环的 i 传进去
      //(
      //  function (n) { // 定义闭包函数
      //    arr.push(function () {
      //      console.log(n)
      //    })
      //  }
      //)(i)
    }
    arr[0]() // 0
    arr[2]() // 2
    var num = 1;
    var obj = {
        num:2,
        add:function(){
            this.num = 3;
            (function(){
                console.log('1', this.num);
                this.num = 4
                console.log('2', this.num);
            })();
            console.log('3', this.num);
        }
    }
    obj.add()
    console.log('4', this.num);
  </script>
</body>
</html>